﻿Imports System.ComponentModel

''' <summary>
''' プリンターを表すクラスです。
''' </summary>
''' <remarks></remarks>
<DataObject()>
Public NotInheritable Class PrintQueue
  Inherits DomainObject

#Region " プライベートフィールド "
  Private ReadOnly _name, _server As String
#End Region

#Region " フレンドコンストラクター "
  ''' <summary>
  ''' <see cref="DirectoryEntry"/> を指定して <see cref="PrintQueue"/> クラスの新しいインスタンスを初期化します。
  ''' </summary>
  ''' <param name="entry"><see cref="DirectoryEntry"/>。</param>
  ''' <remarks></remarks>
  Friend Sub New(entry As DirectoryEntry)
    MyBase.New(entry)

    _name = entry.Properties.Item("printerName").Value.ToString()
    _server = entry.Properties.Item("serverName").Value.ToString()
  End Sub
#End Region

#Region " パブリックプロパティ "
  ''' <summary>
  ''' カラーかどうかを取得または設定します。
  ''' </summary>
  ''' <value></value>
  ''' <returns>カラーかどうかを示す値。</returns>
  ''' <remarks></remarks>
  Public Property Color As Boolean
    Get
      If MyBase.IsDisposed Then
        Throw New ObjectDisposedException(Me.GetType().Name)
      End If
      Return Convert.ToBoolean(MyBase.Entry.Properties.Item("printColor").Value)
    End Get
    Set(value As Boolean)
      If MyBase.IsDisposed Then
        Throw New ObjectDisposedException(Me.GetType().Name)
      End If
      MyBase.Entry.Properties.Item("printColor").Value = value
    End Set
  End Property

  ''' <summary>
  ''' 両面かどうかを取得または設定します。
  ''' </summary>
  ''' <value></value>
  ''' <returns>両面かどうかを示す値。</returns>
  ''' <remarks></remarks>
  Public Property Duplex As Boolean
    Get
      If MyBase.IsDisposed Then
        Throw New ObjectDisposedException(Me.GetType().Name)
      End If
      Return Convert.ToBoolean(MyBase.Entry.Properties.Item("printDuplexSupported").Value)
    End Get
    Set(value As Boolean)
      If MyBase.IsDisposed Then
        Throw New ObjectDisposedException(Me.GetType().Name)
      End If
      MyBase.Entry.Properties.Item("printDuplexSupported").Value = value
    End Set
  End Property

  ''' <summary>
  ''' 名前を取得します。
  ''' </summary>
  ''' <value></value>
  ''' <returns>名前。</returns>
  ''' <remarks></remarks>
  Public ReadOnly Property FullName As String
    Get
      Return MyBase.Name
    End Get
  End Property

  ''' <summary>
  ''' 場所を取得または設定します。
  ''' </summary>
  ''' <value></value>
  ''' <returns>場所。</returns>
  ''' <remarks></remarks>
  Public Property Location As String
    Get
      If MyBase.IsDisposed Then
        Throw New ObjectDisposedException(Me.GetType().Name)
      End If
      Return DirectCast(MyBase.Entry.Properties.Item("location").Value, String)
    End Get
    Set(value As String)
      If MyBase.IsDisposed Then
        Throw New ObjectDisposedException(Me.GetType().Name)
      End If
      MyBase.Entry.Properties.Item("location").Value = value
    End Set
  End Property

  ''' <summary>
  ''' 最高解像度を取得または設定します。
  ''' </summary>
  ''' <value></value>
  ''' <returns>最高解像度。</returns>
  ''' <remarks></remarks>
  Public Property MaxResolution As Integer?
    Get
      If MyBase.IsDisposed Then
        Throw New ObjectDisposedException(Me.GetType().Name)
      End If
      Return DirectCast(MyBase.Entry.Properties.Item("printMaxResolutionSupported").Value, Integer?)
    End Get
    Set(value As Integer?)
      If MyBase.IsDisposed Then
        Throw New ObjectDisposedException(Me.GetType().Name)
      End If
      MyBase.Entry.Properties.Item("printMaxResolutionSupported").Value = value
    End Set
  End Property

  ''' <summary>
  ''' モデルを取得または設定します。
  ''' </summary>
  ''' <value></value>
  ''' <returns>モデル。</returns>
  ''' <remarks></remarks>
  Public Property Model As String
    Get
      If MyBase.IsDisposed Then
        Throw New ObjectDisposedException(Me.GetType().Name)
      End If
      Return DirectCast(MyBase.Entry.Properties.Item("driverName").Value, String)
    End Get
    Set(value As String)
      If MyBase.IsDisposed Then
        Throw New ObjectDisposedException(Me.GetType().Name)
      End If
      MyBase.Entry.Properties.Item("driverName").Value = value
    End Set
  End Property

  ''' <summary>
  ''' プリンター名を取得します。
  ''' </summary>
  ''' <value></value>
  ''' <returns>プリンター名。</returns>
  ''' <remarks></remarks>
  Public Overrides ReadOnly Property Name As String
    Get
      Return _name
    End Get
  End Property

  ''' <summary>
  ''' サーバー名を取得します。
  ''' </summary>
  ''' <value></value>
  ''' <returns>サーバー名。</returns>
  ''' <remarks></remarks>
  Public ReadOnly Property ServerName As String
    Get
      Return _server
    End Get
  End Property

  ''' <summary>
  ''' 印刷速度を取得または設定します。
  ''' </summary>
  ''' <value></value>
  ''' <returns>印刷速度。</returns>
  ''' <remarks></remarks>
  Public Property Speed As Integer?
    Get
      If MyBase.IsDisposed Then
        Throw New ObjectDisposedException(Me.GetType().Name)
      End If
      Return DirectCast(MyBase.Entry.Properties.Item("printPagesPerMinute").Value, Integer?)
    End Get
    Set(value As Integer?)
      If MyBase.IsDisposed Then
        Throw New ObjectDisposedException(Me.GetType().Name)
      End If
      MyBase.Entry.Properties.Item("printPagesPerMinute").Value = value
    End Set
  End Property

  ''' <summary>
  ''' ホチキス止めかどうかを取得または設定します。
  ''' </summary>
  ''' <value></value>
  ''' <returns>ホチキス止めかどうかを示す値。</returns>
  ''' <remarks></remarks>
  Public Property Stapling As Boolean
    Get
      If MyBase.IsDisposed Then
        Throw New ObjectDisposedException(Me.GetType().Name)
      End If
      Return Convert.ToBoolean(MyBase.Entry.Properties.Item("printStaplingSupported").Value)
    End Get
    Set(value As Boolean)
      If MyBase.IsDisposed Then
        Throw New ObjectDisposedException(Me.GetType().Name)
      End If
      MyBase.Entry.Properties.Item("printStaplingSupported").Value = value
    End Set
  End Property
#End Region

#Region " パブリックメソッド "
  ''' <summary>
  ''' 指定した名前のプリンターを検索します。このメソッドはデータバインド用です。
  ''' </summary>
  ''' <param name="name">名前。</param>
  ''' <returns>プリンター。</returns>
  ''' <remarks></remarks>
  <DataObjectMethod(DataObjectMethodType.Select)>
  Public Shared Function FindByName(name As String) As PrintQueue
    Return DirectCast(DirectoryAccess.FindDirectoryObject(name, CategoryType.PrintQueue), PrintQueue)
  End Function

  ''' <summary>
  ''' プリンターの一覧を取得します。このメソッドはデータバインド用です。
  ''' </summary>
  ''' <returns>プリンターの一覧。</returns>
  ''' <remarks></remarks>
  <DataObjectMethod(DataObjectMethodType.Select)>
  Public Shared Function GetPrintQueues() As IList(Of PrintQueue)
    Return DirectoryAccess.GetPrintQueues()   'プリンターを取得
  End Function
#End Region
End Class
